package com.wmx.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Mybatis-Plus 拦截器插件配置
 *
 * @author wangMaoXiong
 * @version 1.0
 * @date 2023/3/12 10:13
 */
@Configuration
public class MybatisPlusConfig {

    /**
     * Mybatis-Plus 拦截器插件配置
     * 1、需要的插件都可以方法中进行添加。
     * * 官网文档：https://baomidou.com/pages/2976a3/#mybatisplusinterceptor
     *
     * @return ：返回MybatisPlus核心拦截器插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        // 分页插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置生成 countSql 优化掉 join(暂时只支持 left join)
        paginationInnerInterceptor.setOptimizeJoin(true);
        // 设置单页分页条数限制
        paginationInnerInterceptor.setMaxLimit(500L);
        // 指定数据库类型(建议单一数据库类型的均设置 dbType)
        paginationInnerInterceptor.setDbType(DbType.H2);
        // 溢出总页数后是否进行处理，默认false不处理，返回为空；配置为true时，溢出总数页后，展示为最后一页的数据。
        paginationInnerInterceptor.setOverflow(true);

        // 添加插件
        // 使用多个功能插件时需要注意顺序关系，对 sql 进行单次改造的优先放入,不对 sql 进行改造的最后放入，建议使用如下的先后顺序：
        // 多租户,动态表名->分页,乐观锁->sql 性能规范,防止全表更新与删除
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
        // 乐观锁插件
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 防全表更新与删除插件(针对 update 和 delete 语句 作用: 阻止恶意的全表更新删除)
        mybatisPlusInterceptor.addInnerInterceptor(new BlockAttackInnerInterceptor());
        return mybatisPlusInterceptor;
    }

}
